package dao.jdbc;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import model.Teilnehmer;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class TeilnehmerJdbcDaoTest {


  Connection con;
  TeilnehmerJdbcDao jdbcTeilnehmer= new TeilnehmerJdbcDao();
  TerminJdbcDao jdbcTermin = new TerminJdbcDao();
  TestDaten testdaten;

  @Before
  public void setUp() throws Exception {

    testdaten = new TestDaten();

    Class.forName("com.mysql.jdbc.Driver");

    con = DriverManager.getConnection("jdbc:mysql://localhost/", "root", "");

    assertNotNull(con);
    assertFalse(con.isClosed());

    Statement statement = con.createStatement();

    statement.execute("SET AUTOCOMMIT = 0;");

    statement.execute("DROP DATABASE Terminplaner;"); // !!

    statement.execute("CREATE DATABASE Terminplaner;");
    statement
        .execute("CREATE TABLE  Terminplaner.termine (ID INT AUTO_INCREMENT PRIMARY KEY, timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, thema VARCHAR(99) NOT NULL, beschreibung VARCHAR(9999) NOT NULL, terminanfang VARCHAR(99) NOT NULL, terminende VARCHAR(99) NOT NULL, terminart VARCHAR(99) NOT NULL, prioritaet INT NOT NULL) ENGINE = MYISAM ");
    statement
        .execute("CREATE TABLE  Terminplaner.adressen(ID INT AUTO_INCREMENT PRIMARY KEY, timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, TerminID INT NOT NULL, ort VARCHAR(99) NOT NULL, plz VARCHAR(99) NOT NULL, strasse VARCHAR(99) NOT NULL, land VARCHAR(99) NOT NULL) ENGINE = MYISAM ");
    statement
        .execute("CREATE TABLE  Terminplaner.teilnehmer(ID INT AUTO_INCREMENT PRIMARY KEY, timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, TerminID INT NOT NULL, vorname VARCHAR(99) NOT NULL, nachname VARCHAR(99) NOT NULL, anrede VARCHAR(99) NOT NULL) ENGINE = MYISAM ");
    statement
        .execute("CREATE TABLE  Terminplaner.anlagen(ID INT AUTO_INCREMENT PRIMARY KEY, timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, TerminID INT NOT NULL, beschreibung VARCHAR(99) NOT NULL, pfad VARCHAR(99) NOT NULL, timestampanlage VARCHAR(99) NOT NULL) ENGINE = MYISAM ");

  }

  @Test
  public void testSaveInsert() throws IOException {
    jdbcTeilnehmer.save(con, testdaten.testTeilnehmer);
    assertEquals(testdaten.testTeilnehmer, jdbcTeilnehmer.findById(con, new Long(1)));
  }

  @Test
  public void testSaveUpdate() throws IOException {
    jdbcTeilnehmer.save(con, testdaten.testTeilnehmer);
    testdaten.testTeilnehmer.setVorname("Kim");
    testdaten.testTeilnehmer.setVorname("Jong");
    testdaten.testTeilnehmer.setAnrede("Diktator");
    jdbcTeilnehmer.save(con, testdaten.testTeilnehmer);
    assertEquals(testdaten.testTeilnehmer, jdbcTeilnehmer.findById(con, new Long(1)));

  }

  @Test
  public void testDelete() throws IOException {
    jdbcTeilnehmer.save(con, testdaten.testTeilnehmer);
    jdbcTeilnehmer.delete(con, testdaten.testTeilnehmer);
    assertTrue(jdbcTeilnehmer.findAll(con).isEmpty());
  }

  @Test
  public void testFindById() throws IOException {
    jdbcTeilnehmer.save(con, testdaten.testTeilnehmer);
    jdbcTeilnehmer.save(con, testdaten.testTeilnehmer2);
    assertEquals(testdaten.testTeilnehmer, jdbcTeilnehmer.findById(con, new Long(1)));
    assertEquals(testdaten.testTeilnehmer2, jdbcTeilnehmer.findById(con, new Long(2)));
  }

  @Test
  public void testFindAll() throws IOException {
    jdbcTeilnehmer.save(con, testdaten.testTeilnehmer);
    jdbcTeilnehmer.save(con, testdaten.testTeilnehmer2);
    jdbcTeilnehmer.save(con, testdaten.testTeilnehmer3);
    ArrayList<Teilnehmer> teilnehmer = jdbcTeilnehmer.findAll(con);
    assertEquals(3, teilnehmer.size());
    assertTrue(teilnehmer.contains(testdaten.testTeilnehmer));
    assertTrue(teilnehmer.contains(testdaten.testTeilnehmer2));
    assertTrue(teilnehmer.contains(testdaten.testTeilnehmer3));
  }

  @Test
  public void testFindByTerminId() throws IOException {
    jdbcTeilnehmer.save(con, testdaten.testTeilnehmer);
    jdbcTeilnehmer.save(con, testdaten.testTeilnehmer2);
    jdbcTeilnehmer.save(con, testdaten.testTeilnehmer3);
    
    ArrayList<Teilnehmer> teilnehmerliste = jdbcTeilnehmer.findByTerminId(con, new Long(-999));
    
    assertEquals(3, teilnehmerliste.size());
    assertTrue(teilnehmerliste.contains(testdaten.testTeilnehmer));
    assertTrue(teilnehmerliste.contains(testdaten.testTeilnehmer2));
    assertTrue(teilnehmerliste.contains(testdaten.testTeilnehmer3));
  }
  
  @Test
  public void testFindByTerminId2() throws IOException {
    jdbcTeilnehmer.save(con, testdaten.testTeilnehmer);
    jdbcTeilnehmer.save(con, testdaten.testTeilnehmer2);
    jdbcTeilnehmer.save(con, testdaten.testTeilnehmer3);
    

    
    ArrayList<Teilnehmer> teilnehmerliste = jdbcTeilnehmer.findByTerminId(con, new Long(-999));
    
    assertEquals(3, teilnehmerliste.size());
    assertTrue(teilnehmerliste.contains(testdaten.testTeilnehmer));
    assertTrue(teilnehmerliste.contains(testdaten.testTeilnehmer2));
    assertTrue(teilnehmerliste.contains(testdaten.testTeilnehmer3));
  }


  @After
  public void AfterClass() throws SQLException {

    if (!con.isClosed())
      con.close();

  }
}
